package com.xxkj.drugtraceability.ui.update

import android.app.Application
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.os.Handler
import android.os.Message
import androidx.core.content.FileProvider
import androidx.lifecycle.viewModelScope
import com.xxhis.drugtraceability.base.BaseViewModel
import com.xxkj.drugtraceability.bean.RequestBodyData
import com.xxkj.drugtraceability.net.DownFileByWebRequest
import com.xxkj.drugtraceability.net.WanService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File

/**
 * author: zhoujingjin
 * created on: 2024/9/20 16:24
 * description:
 */
class UpdateViewModel(application: Application):BaseViewModel(application) {

    fun download( fileUrl:String, fileName:String, handler: Handler?){
        viewModelScope.launch(Dispatchers.Main) {
            withContext(Dispatchers.IO) {
                val url =
                    "${WanService.BASE_URL_API}/api/drugPdaClientVersion/downloadNew?fileUrl=${fileUrl}&fileName=${fileName}"
//                    "${BASE_URL_API}/api/drugPdaClientVersion/downloadNew?fileUrl=${data.fileUrl}"
                val filePath = getSavePath()
                val file = File(filePath)
                deleteFile(file) // 文件夹存在删除
                if (!file.exists()) file.mkdirs() // 文件夹不存在则创建
                // 本地文件全名
                val fullName = "$filePath/$fileName"
                DownFileByWebRequest.DownFile(url, fullName)
                // Android获取一个用于打开文件的intent，下载完成后提示安装；
                val intent = Intent()
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                intent.action = Intent.ACTION_VIEW

                // 判断是否是7.0
                if (Build.VERSION.SDK_INT >= 24) {
                    // 适配android7.0 ，不能直接访问原路径
                    // 需要对intent 授权
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                    intent.setDataAndType(FileProvider.getUriForFile(app, "com.xxhis.drugtraceability", File(fullName)), "application/vnd.android.package-archive")
                } else {
                    intent.setDataAndType(Uri.fromFile(File(fullName)), "application/vnd.android.package-archive")
                }
                if (handler != null) {
                    val mes = Message()
                    mes.arg1 = 0
                    mes.obj = intent
                    handler.sendMessage(mes)
                }
//                context.startActivity(intent)
//              val call =  startRepository.downloadNew(data.fileUrl,data.fileName)
//                call.enqueue(object : retrofit2.Callback<ResponseBody> {
//                    override fun onResponse(call: Call<ResponseBody>, response: retrofit2.Response<ResponseBody>) {
//                        if (response.isSuccessful) {
//                            response.body()?.let { responseBody ->
//                                // 保存文件的逻辑
//                                val isSuccess = saveToFile(responseBody, fileName)
//                                if (isSuccess) {
//                                    println("文件下载成功")
//                                } else {
//                                    println("文件保存失败")
//                                }
//                            }
//                        } else {
//                            println("下载失败，错误代码: ${response.code()}")
//                        }
//                    }
//
//                    override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
//                        println("下载失败: ${t.message}")
//                    }
//                })
            }
        }
    }
    /**
     * 删除文件夹所有内容
     */
    private fun deleteFile(file: File) {
        try {
            if (file.exists()) { // 判断文件是否存在
                if (file.isFile) { // 判断是否是文件
                    file.delete() // delete()方法 你应该知道 是删除的意思;
                } else if (file.isDirectory) { // 否则如果它是一个目录
                    val files = file.listFiles() // 声明目录下所有的文件 files[];
                    for (i in files.indices) { // 遍历目录下所有的文件
                        deleteFile(files[i]) // 把每个文件 用这个方法进行迭代
                    }
                }
                file.delete()
            }
        } catch (ex: Exception) {
            ex.printStackTrace()
        }
    }
    private fun getSavePath(): String? {
        // 判断sd卡是否存在
        val sdCardExist = Environment.MEDIA_MOUNTED == Environment
            .getExternalStorageState()
        if (sdCardExist) {
            val sdDir = Environment.getExternalStorageDirectory() // 获取根目录
            return "$sdDir/xxhis/drugtraceability/update"
        }
        throw Exception("没有找到sd卡")
    }
}